package ar.utn.frgp.banco.service.impl;

import java.util.Date;
import java.util.List;

import ar.utn.frgp.banco.dao.CuentasDAO;
import ar.utn.frgp.banco.dao.PlazoFijoDao;
import ar.utn.frgp.banco.entity.Cuenta;
import ar.utn.frgp.banco.entity.Movimientos;
import ar.utn.frgp.banco.entity.PlazoFijo;
import ar.utn.frgp.banco.entity.enums.OrigenMovimiento;
import ar.utn.frgp.banco.entity.enums.TipoMovimiento;
import ar.utn.frgp.banco.exceptions.PersonalisedException;
import ar.utn.frgp.banco.exceptions.ServiceException;
import ar.utn.frgp.banco.service.EBAbstractService;
import ar.utn.frgp.banco.service.PlazoFijoService;

public class PlazoFijoServiceImpl extends EBAbstractService implements PlazoFijoService{

	private CuentasDAO cuentasDAO;
	
	private PlazoFijoDao plazoFijoDAO;
	
	public void crearPlazoFijo(PlazoFijo p, Long nroCuenta)
			throws ServiceException, PersonalisedException {
		
		Cuenta cuenta = commonDAO.load(Cuenta.class, nroCuenta);
		
		if(p.getCuentaDestino().getNumero() != null){
			Cuenta cuentaDestino = commonDAO.load(Cuenta.class, p.getCuentaDestino().getNumero());
			p.setCuentaDestino(cuentaDestino);			
		}
		
		cuenta.getPlazosFijo().add(p);
		try {
			cuenta.setSaldo(cuenta.getSaldo().subtract(p.getMonto()));
			
			Movimientos mov = new Movimientos();
			
			mov.setFecha(new Date());
			mov.setMontoMovimiento(p.getMonto());
			mov.setOrigen(OrigenMovimiento.PLAZO_FIJO);
			mov.setTipoMov(TipoMovimiento.EXTRACCION);
			mov.setSaldoActual(cuenta.getSaldo());
			
			cuenta.getMovimientos().add(mov);
			
			commonDAO.save(cuenta);			
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	public void crearPlazoFijo(PlazoFijo p)
	throws ServiceException, PersonalisedException {

		if(p.getCuentaDestino().getNumero() != null){
			Cuenta cuentaDestino = commonDAO.load(Cuenta.class, p.getCuentaDestino().getNumero());
			p.setCuentaDestino(cuentaDestino);			
		}
		try {
			commonDAO.save(p);			
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

	public List<PlazoFijo> plazosFijosPorCliente(String dni)
			throws ServiceException, PersonalisedException {
		return plazoFijoDAO.consultarHistoricoPlazoFijo(dni);
	}

	public void actualizarPlazoFijo(PlazoFijo p, Long id)
			throws ServiceException, PersonalisedException {
		// TODO Auto-generated method stub
		
	}

	public CuentasDAO getCuentasDAO() {
		return cuentasDAO;
	}

	public void setCuentasDAO(CuentasDAO cuentasDAO) {
		this.cuentasDAO = cuentasDAO;
	}

	public PlazoFijoDao getPlazoFijoDAO() {
		return plazoFijoDAO;
	}

	public void setPlazoFijoDAO(PlazoFijoDao plazoFijoDAO) {
		this.plazoFijoDAO = plazoFijoDAO;
	}

	
	
	
}
